package thread;

import java.util.concurrent.locks.ReentrantLock;

/**
 * lock和lockInterruptibly，前者不会呗interrupt打断，后者接收中断信号
 * 在资源竞争不是很激烈的情况下，Synchronized的性能要优于ReetrantLock，
 * 但是在资源竞争很激烈的情况下，Synchronized的性能会下降几十倍，但是ReetrantLock的性能能维持常态；
 * 、synchronized是在JVM层面上实现的，不但可以通过一些监控工具监控synchronized的锁定，而且在代码执行时出现异常，JVM会自动释放锁定，
 * 但是使用Lock则不行，lock是通过代码实现的，要保证锁定一定会被释放，就必须将unLock()放到finally{}中
 * 可以实现公平锁
 * @author Han
 */
public class ReentrantlockDemo {
	public static int i;
	public static ReentrantLock lock = new ReentrantLock();
	public static void addi(){
		lock.lock();
		//保证了获取不到情况下的释放，而且有公平竞争的特性
		//lock.tryLock(time, unit)
		try {
			i++;
			System.out.println(i);
		} catch(Exception e){
		    e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	class TTThread extends Thread{
		@Override
		public void run() {
			ReentrantlockDemo.addi();
		}
	}
	public static void main(String[] args) {
		for(int c = 0;c<100;c++){
			new ReentrantlockDemo().new TTThread().start();
		}
	}
}
